package com.shop.filter;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import com.shop.utils.JwtUtil;

import io.jsonwebtoken.Claims;

@Component
public class TokenFilter extends ZuulFilter {

	@Autowired
	private JwtUtil jwtUtil;

	// 过滤器执行顺序,当一个请求在同一个阶段的时候存在多个过滤器的时候，多个过滤器执行顺序
	//数字越小，执行优先级越高，可以为负数
	public int filterOrder() {
		return 0;
	}

	// 过滤类型 pre 表示在请求之前进行执行
	@Override
	public String filterType() {
		//FilterConstants.PRE_TYPE;
		return "pre";
	}

	//并不是所有请求来了都需要走过滤器，只有返回true的才会调用run方法
	@Override
	public boolean shouldFilter() {
		RequestContext ctx = RequestContext.getCurrentContext();
		HttpServletRequest request = ctx.getRequest();
		//HttpServletResponse response = ctx.getResponse();
		// 返回 false 则不会执行 run 方法
		// 可以根据 request 信息判断是否需要验证
		// 比如，过滤请求地址结尾为 .json 的请求
		String url = request.getRequestURI();
		if (url.endsWith(".json") || url.contains("api-docs")) {
			return false;
		}
		return true;
	}

	/**
	 * 过滤器内执行的操作 return 任何ojbect的值都表示继续执行 setsendzullRespponse(false)表示不再继续执行
	 * 
	 * @return
	 * @throws ZuulException
	 */
	@Override
	public Object run() throws ZuulException {
		
		System.out.println("经过后台过滤器了！");
		RequestContext requestContext = RequestContext.getCurrentContext();
		//request域
		HttpServletRequest request = requestContext.getRequest();

		if (request.getMethod().equals("OPTIONS")) {
			return null;
		}

		if (request.getRequestURI().indexOf("login") > 0) {
			return null;
		}

		//得到头信息
		String header = request.getHeader("Authorization");
		if (header != null && !"".equals(header)) {
			// 正常执行调用其他服务接口...
			// 根据Token从Redis中获取，看是否存在，不存在也不行
			if (header.startsWith("Bearer ")) {
				String token = header.substring(7);
				try {
					Claims claims = jwtUtil.parseJWT(token);
					String roles = (String) claims.get("roles");
					if (roles.equals("admin")) {
						//把头信息转发下去，并且放行
						requestContext.addZuulRequestHeader("Authorization", header);
						return null;
					}
				} catch (Exception e) {
					e.printStackTrace();
					requestContext.setSendZuulResponse(false);//终止运行
				}
			}
		}
		// 不会继续执行... 不会去调用服务接口，网关服务直接响应给客户端
		requestContext.setSendZuulResponse(false);//终止运行
		requestContext.setResponseStatusCode(403);
		requestContext.setResponseBody("权限不足");
		requestContext.getResponse().setContentType("text/html;charset=utf-8");
		
		return null;
	}
}
